#include <iostream>
#include <memory>
using namespace std;

/*
    三种智能指针的区别：
        对象赋值的区别：
            auto_ptr：对象之间可以赋值，将右边对象堆空间的所有权转让给左边对象，右边对象指向空
            unique_ptr：对象之间不可以赋值，unique_ptr对象只能通过new创建，不能通过赋值进行对象之间的赋值
            shared_ptr：对象之间可以赋值，内部定义了int类型的变量统计指向同一个堆空间的对象数目
                                        当对象赋值的时候，变量++
                                        当对象地址空间释放的时候，变量--
                                        当最后一个对象释放的时候，才调用delete去释放堆空间
*/

int main()
{
    auto_ptr<int> p1(new int);
    *p1 = 10;
    auto_ptr<int> p2;
    // auto_ptr会将p1指向的堆空间的所有权转让给p2,p1就不能访问之前的堆空间了，p1指向空
    p2 = p1; // 表示p1和p2指向同一块内存
    
    // cout << *p1 << endl; 出错
    cout << *p2 << endl;

    unique_ptr<int> p3(new int);
    unique_ptr<int> p4;
    // p4 = p3; 出错 unique_ptr对象之间不能赋值

    shared_ptr<int> p5(new int);
    *p5 = 78;
    shared_ptr<int> p6;
    p6 = p5;    // p5和p6指向同一块内存
    cout << "p5 = " << *p5 << endl;
    cout << "p6 = " << *p6 << endl;
    shared_ptr<int> p7;
    p7 = p5;
    cout << "p7 = " << *p7 << endl;
    *p7 = 80;
    cout << "p5 = " << *p5 << endl;
    cout << "p6 = " << *p6 << endl;
    cout << "p7 = " << *p7 << endl;


    return 0;
}